/**
**********************************************************************************************************************************************************************************************************************************
* @file:	String.h
* @author:	zinface
* @date:	2021年09月11日 20:53:58 星期六
* @brief:	FinalC 提供的 String 数据类型操作集
* 
* 1. createString(): 创建空String
* 2. createStringWith_cstr: 基于给定的字符串创建 String 对象实例
* 3. createStringWith_copy_cstr: 基于给定的字符串拷贝创建 String 对象实例
* 4. createStringWith_size: 基于给定的容器大小创建 String 对象实例
* 
* 5. destroyString: 释放 String 对象
* 6. clearString: 清空 String 对象
* 7. deleteString: 销毁 String 对象

宗旨：为扩展
**********************************************************************************************************************************************************************************************************************************
**/

#ifndef __STRING__H__
#define __STRING__H__

#include "List.h"

#include <string.h>

// ┌──────────────────────────────────────────────────────────────────────────────┐
// │ typedef struct _GString         GString;                                     │
// │                                                                              │
// │ struct _GString                                                              │
// │ {                                                                            │
// │   gchar  *str;                                                               │
// │   gsize len;                                                                 │
// │   gsize allocated_len;                                                       │
// │ };                                                                           │
// └──────────────────────────────────────────────────────────────────────────────┘

// GString *g_string_sized_new(size)
// ┌──────────────────────────────────────────────────────────────────────────────┐
// │ GString *                                                                    │
// │ g_string_sized_new (gsize dfl_size)                                          │
// │ {                                                                            │
// │   GString *string = g_slice_new (GString);                                   │
// │                                                                              │
// │   string->allocated_len = 0;                                                 │
// │   string->len   = 0;                                                         │
// │   string->str   = NULL;                                                      │
// │                                                                              │
// │   g_string_maybe_expand (string, MAX (dfl_size, 2));                         │
// │   string->str[0] = 0;                                                        │
// │                                                                              │
// │   return string;                                                             │
// │ }                                                                            │
// └──────────────────────────────────────────────────────────────────────────────┘

// ┌──────────────────────────────────────────────────────────────────────────────┐
// │ GString *                                                                    │
// │ g_string_new (const gchar *init)                                             │
// │ {                                                                            │
// │   GString *string;                                                           │
// │                                                                              │
// │   if (init == NULL || *init == '\0')                                         │
// │     string = g_string_sized_new (2);                                         │
// │   else                                                                       │
// │     {                                                                        │
// │       gint len;                                                              │
// │                                                                              │
// │       len = strlen (init);                                                   │
// │       string = g_string_sized_new (len + 2);                                 │
// │                                                                              │
// │       g_string_append_len (string, init, len);                               │
// │     }                                                                        │
// │                                                                              │
// │   return string;                                                             │
// │ }                                                                            │
// └──────────────────────────────────────────────────────────────────────────────┘

// ------------------------------------ c_str utils
static char * c_str_copy(const char *str);

static char* c_str_copy_expand_size(const char* str, int expand_size);

static char* c_str_new(long size);

// ------------------------------------ c_str utils

FinalC_Object_Define(String) {
    char* value;
    int len;
    int allocated_len;
};
// FinalC_Object_Size(String);

#define FinalC_String_Func_Define(func) \
    FinalC_Object_Func_Suffix(string, func)

// ------------------------------------ Constructor

/**
 * createString: 创建空的 String 对象实例
 *
 */
FINALC_WARN_UNUSED_RESULT
FinalC_Object_Create_Define(String);
/**
 * createStringWith_cstr: 基于给定的字符串创建 String 对象实例
 *
 */
// FinalC_Object_Create_With_Obj_Define(String, value, char);
FINALC_WARN_UNUSED_RESULT
String *createStringWith_cstr(char *str);
/**
 * createStringWith_copy_cstr: 基于给定的字符串拷贝创建 String 对象实例
 *
 */
FINALC_WARN_UNUSED_RESULT
String *createStringWith_copy_cstr(const char *str);
/**
 * createStringWith_size: 基于给定的容器大小创建 String 对象实例
 *
 */
FINALC_WARN_UNUSED_RESULT
String *createStringWith_size(int size);

// String *createStringWith_size(const char *str) {
//     String *s = createString();
//     s->value = c_str_copy(str);
//     s->len = strlen(s->value);
//     return s;
// }

// ------------------------------------ Destructor

/**
 * destroyString: 释放 String 对象
 * 
 * NOTE: 该对象指向的元素(如有)将不会进行释放，否则使用 deleteString()
 */
void destroyString(String *s);
FinalC_Object_After(String, destroy);
FinalC_Object_After_Support(String);

/**
 * clearString: 清空 String 对象
 * 
 * NOTE: 该对象指向的内存(如有)将会进行释放
 */
void clearString(String *s);

/**
 * deleteString: 销毁 String 对象
 * 
 * NOTE: 该对象指向的内存(如有)将会进行释放
 */
void deleteString(String *s);
FinalC_Object_After(String, delete);

// ------------------------------------ Exstenstion Func: Append

/**
 * stringAppend_cstr: 向 String 对象追加内容
 *
 * return: 返回 String 对象
 */
String *stringAppend_cstr(String *s, const char *str);

/**
 * stringAppend_cstrs: 向 String 对象追加多个内容
 *
 * return: 返回 String 对象
 */
String *stringAppend_cstrs(String *s, char *str, ...);


// String *stringAppend_delete(String *s, String *v) {
//     s = stringAppend_cstr(s, v->value);
//     deleteString(v);
//     return s;
// }

/**
 * stringAppend_char: 向 String 对象追加内容
 *
 * return: 返回 String 对象
 */
String *stringAppend_char(String *s, char c);

/**
 * stringAppend: 向 String 对象追加内容
 *
 * return: 返回 String 对象
 */
String *stringAppend(String *s, String *v);

// String *FinalC_String_Func_Define(Append)(String *s, String *v);

// FinalC_Object_Create_With_Obj_After_Define

// ------------------------------------ Exstenstion Func: Compare

bool stringCompare_cstr(String *s, const char *v);
bool stringCompare(String *s, String *v);

// ------------------------------------ Exstenstion Func: Contains

bool stringContains(String *s, String *v);
bool stringContains_cstr(String *s, const char *v);
bool stringContains_char(String *s, const char v);


// ------------------------------------ Exstenstion Func: Split

List* stringSplit(const String *s, const char value);
List* stringSplits(const String *s, const char *value);
List* stringSplit_cnt(const String *s, const char value, int cnt);

// StringList *stringSplit(String *s, String *v) {
    
// }


// ------------------------------------ Exstenstion Func: Replace
String *stringReplace(String *s, const char *old, const char *replate);


/**
 * newString: 创建 String 对象，扩展 init 大小，并填充 init 值
 *
 */
// String* newString(const fchar *init);

/**
 * newStringSize: 创建 String 对象，扩展 size 大小，并填充 init 值
 *
 */
// String* newStringSize(const fchar *init, int size);


#endif  //!__STRING__H__
